const dataKit = require( "./dataKit");
const dateKit = require("./dateKit");
const util = require("./util");
/**
 * 注意：使用await的方法必须加上async，不然会报错！！
 */
module.exports = {
   /**
    * 根据名称获取商户
    * @param {*} openId 商户的openid
    */
   async getUserByOpenId(context,openId){
      //过滤条件
      const filter = {openId: openId};
      let merchant =await dataKit.findOne(context,"user_info",filter);
      return merchant;
   },
   /**
    * 根据openId获取商户
    * @param {*} openId 商户的openid
    */
   async getMerchantByOpenId(context,openId){
      if(!openId){
         console.info("getMerchantByOpenId --> openId是必须的");
         return null;
      }
      //过滤条件
      const filter = {openId: openId};
      let merchant =await dataKit.findOne(context,"merchant_info",filter);
      return merchant;
   },
   /**
    * 获取商户的AccessToken
    * @param {*} openId 商户的openid
    */
   async getMerchantAccessToken(context,openId){
      const merchant =await this.getMerchantByOpenId(context,openId);
      return merchant.accessToken;
   },
   /**
    * 获取商户唯一的商户AccessToken
    */
   async getDefaultMerchantAccessToken(context){
      //过滤条件
      const filter = {};
      let merchant =await dataKit.findOne(context,"merchant_info",filter);
      return merchant.accessToken;
   },
   /**
    * 商品列表
    * @param {*} context 
    * @param {*} openId 商户的openid
    * @param {*} cid 类目id
    */
   async getProductList(context){
      const accessToken =await this.getDefaultMerchantAccessToken(context);
      const result = await context.cloud.topApi.invoke({  
        api: 'taobao.items.onsale.get',  
        autoSession: false,
        data:{
           session:accessToken,
           fields:"num_iid,title,cid,price,pic_url",
           page_size:200
        }  
      });
      return result;
   },
    /**
     * 判断用户是否是会员
     * @param {*} context 上下文
     * @param {*} nick 用户 nick
     */
    async isTaobaoMember(context,mix_nick) {
        const accessToken =await this.getDefaultMerchantAccessToken(context);
        const identity = await context.cloud.topApi.invoke({
            api:'taobao.crm.member.identity.get',
            autoSession: false,
            data:{
                session: accessToken,
                mix_nick
            }
        });
        if (identity.result.member_info) {// 是会员
            return true;
        }else {
            return false;
        }
    },
    /**
     * 查询用户淘宝订单列表
     * @param {*} context 
     * @param {*} access_token 商家 token
     * @param {*} open_id 用户open_id
     * @param {Object} param 参数
     *  @param {String} access_token 用户token
     *  @param {String} open_id 用户 open_id
     *  @param {String} start_created 查询范围开始时间
     *  @param {String} end_created 结束时间
     */
    async taobaoApiToSoldOrders(context,param) {
        const trades = await context.cloud.topApi.invoke({
            api:'taobao.open.trades.sold.get',
            autoSession: false,
            data: {
                session: param.access_token,
                fields: 'tid,orders',
                buyer_open_id: param.open_id,
                start_created: param.start_created,
                end_created: param.end_created,
                type: 'tmall_i18n',
                status: 'TRADE_FINISHED',// 交易成功
                page_no: 1,
                page_size: 100
            }
        });
        // 判断用户是否有购买过订单
        if (!trades || trades.total_results <= 0) {
            return false;
        } else {
            return true;
        }
    },
    /**
     *  CRM会员积分查询开放接口
     * @param {*} context 上下文
     * @param {*} mix_nick 用户 mix_nick
     */
    async getAvailablePoint(context,mix_nick) {
        const accessToken =await this.getDefaultMerchantAccessToken(context);
        const result = await context.cloud.topApi.invoke({
            api:'taobao.crm.point.available.get',
            autoSession: false,
            data:{
                session: accessToken,
                mix_nick: mix_nick
            }
        });
        return result;
    },
   /**
    * 发奖接口 
    * @param {*} context 
    * @param {*} receiver_id  接收奖品的用户openId
    * @param {*} right_ename 发放的权益(奖品)唯一标识
    * @param {*} unique_id 幂等校验id，业务重试需要，自定义唯一字段即可
    *  * 返回：
        result_msg	String	发放成功	接口返回消息
        result_code	String	SEND_SUCCESS	接口返回代码
        result_success	Boolean	true	是否处理成功
        right_id	Number	891033	权益id
        prize_name	String	广陌测试虚拟奖品	奖品名称
    */
   async sendBenefit(context,receiver_id,right_ename,unique_id){
      const accessToken =await this.getDefaultMerchantAccessToken(context);
      const result = await context.cloud.topApi.invoke({  
        api: 'alibaba.benefit.send',  
        autoSession: false,
        data:{
           session:accessToken,
           right_ename:right_ename,
           receiver_id:receiver_id,
           unique_id:unique_id,
           user_type:"taobao",
           app_name:"mtop",
        }  
      });
      return result;
   },
   /**
    * 新增用户数（天）
    * @param {*} context 
    * @param {*} day 
    */
   async getDayNewUserCount(context,day){
      let createTime = {
         $gte:day+" 00:00:00",
         $lt:day+" 23:59:59"
      };
      const resArr = await dataKit.aggregate(context,"user_info",[
         {
            $match:{createTime}
          },
         {
            $group:{
               _id:null,
               total:{ $sum:1 }
            }
         },
      ]);
      return resArr[0].total;
   },
    /**
     * CRM会员积分变更接口
     * @param {*} context 
     * @param {*} open_id 
     * @param {String} opt_type 操作类型，0：增加，1：扣减 （注意需要传字符串！！）
     * @param {*} quantity  积分数量
     */
    async changePoint(context,open_id,opt_type,quantity) {
       let access_token = await this.getDefaultMerchantAccessToken(context);
        //变更类型：0交易，1：互动活动，2：权益兑换，3：手工调整
        const change_type = 1;
        const trades = await context.cloud.topApi.invoke({
            api:'taobao.crm.point.change',
            autoSession: false,
            data: {
                session: access_token,
                change_type,
                open_id,
                opt_type,
                quantity
            }
        });
        return trades;
    },
}
